package handler

import (
	"context"

	"product/domain/model"
	"product/domain/service"

	product "product/proto"

	"product/common"
)

type Product struct {
	ProductDataService service.IProductDataService
}

// 添加产品
func (p *Product) AddProduct(ctx context.Context, in *product.ProductInfo, out *product.ResponseProduct) error {
	productAdd := &model.Product{}
	if err := common.SwapTo(in, productAdd); err != nil {
		return err
	}
	productID, err := p.ProductDataService.AddProduct(productAdd)

	if err != nil {
		return err
	}

	out.ProductId = productID

	return nil
}

// 根据商品id获取商品
func (p *Product) FindProductByID(ctx context.Context, in *product.RequestID, out *product.ProductInfo) error {
	productData, err := p.ProductDataService.FindProductByID(in.ProductId)
	if err != nil {
		return err
	}
	if err = common.SwapTo(productData, out); err != nil {
		return err
	}
	return nil
}

// 更新商品
func (p *Product) UpdateProduct(ctx context.Context, in *product.ProductInfo, out *product.Response) error {
	productAdd := &model.Product{}
	if err := common.SwapTo(in, productAdd); err != nil {
		return err
	}
	err := p.ProductDataService.UpdateProduct(productAdd)
	if err != nil {
		return err
	}
	out.Msg = "更新成功"
	return nil
}

// 删除商品
func (p *Product) DeleteProductByID(ctx context.Context, in *product.RequestID, out *product.Response) error {
	if err := p.ProductDataService.DeleteProduct(in.ProductId); err != nil {
		return err
	}
	out.Msg = "删除成功"
	return nil
}

// 获取所有产品
func (p *Product) FindAllProduct(ctx context.Context, in *product.RequestAll, out *product.AllProduct) error {
	productAll, err := p.ProductDataService.FindAllProduct()

	if err != nil {
		return err
	}
	for _, v := range productAll {
		productInfo := &product.ProductInfo{}
		if err := common.SwapTo(v, productInfo); err != nil {
			return err
		}
		out.ProductInfo = append(out.ProductInfo, productInfo)
	}
	return nil
}
